package com.dongbing.server;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class NettyServerNonClogging {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        // 设置没有客户端的时候 不堵塞
        serverSocketChannel.configureBlocking(false);
        // 绑定端口
        serverSocketChannel.bind(new InetSocketAddress(8080));
        // 创建缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(20);
        // 信道集合
        List<SocketChannel> channelList = new ArrayList<>();
        // 开始监听
        for (;;) {
            // 监听数据 TODO 这个地方已经不堵塞了
            SocketChannel socketChannel = serverSocketChannel.accept();
            // 如果这个地方没有客户端 那么这个地方返回的就是null
            if (socketChannel != null) {
                // 读取的时候 不堵塞
                socketChannel.configureBlocking(false);
                // 将监听到的客户端 记录到集合中
                channelList.add(socketChannel);
            }
            for (SocketChannel channel : channelList) {
                // 读取数据 TODO 这个地方也堵塞
                if (channel.read(buffer) > 0) {
                    // 设置为读模式
                    buffer.flip();
                    // 解析字符串
                    CharBuffer decode = StandardCharsets.UTF_8.decode(buffer);
                    // 打印日志
                    System.out.println("decode = " + decode);
                    // 设置写模式
                    buffer.clear();
                }
            }
        }
    }
}
